/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.scrumpmt.web;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;


import javax.faces.bean.ManagedBean;

import javax.faces.bean.RequestScoped;

import javax.faces.context.FacesContext;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import org.scrumpmt.domain.Colaborador;
import org.scrumpmt.domain.Esfuerzo;
import org.scrumpmt.domain.Estado;
import org.scrumpmt.domain.Tarea;
import org.scrumpmt.domain.Sprint;
import org.scrumpmt.ejb.*;

/**
 *
 * @author Emilio
 */
@ManagedBean(name = "backlogBean")
@RequestScoped
public class BacklogBean {

    private String producto;
    private SprintFacade sprintFacade = lookupSprintFacade();
    private TareaFacade tareaFacade = lookupTareaFacade();
    private EsfuerzoFacade esfuerzoFacade = lookupEsfuerzoFacade();
    private ColaboradorFacade colaboradorFacade = lookupColaboradorFacade();
    private EstadoFacade estadoFacade = lookupEstadoFacade();
    private Tarea selectedTarea;
    private List<Tarea> listado;
    private String esfuerzo;
    private List<Esfuerzo> esfuerzos;
    private String colaborador;
    private static final Logger log = Logger.getLogger(BacklogBean.class.getName());
    private FacesContext context;
    private ProductoSeleccionadoBean tareaActual;

    /**
     * Creates a new instance of BacklogBean
     */
    public BacklogBean() {
        context = FacesContext.getCurrentInstance();
        CrearBacklog();
    }

    public final void CrearBacklog() {
        log.log(Level.INFO, "BacklogBean.java: Entrando en el constructor");
        FacesContext context = FacesContext.getCurrentInstance();
        if (context != null) {
            ProductoSeleccionadoBean productoActual = (ProductoSeleccionadoBean) context.
                    getApplication().evaluateExpressionGet(context, "#{productoSeleccionadoBean}", ProductoSeleccionadoBean.class);
            producto = productoActual.getProductoActual();
            buscarBacklog();
        }

        log.log(Level.INFO, "BacklogBean.java: El producto es {0}", producto);

        if (listado == null) {
            listado = new ArrayList<Tarea>();
        }

    }

    public List<Tarea> getListado() {
        return listado;
    }

    public void setListado(List<Tarea> listado) {
        this.listado = listado;
        log.log(Level.INFO, "setListado(): {0}", listado.toString());
    }

    public String getProducto() {
        return producto;
    }

    public void setProducto(String producto) {
        this.producto = producto;
    }

    public Tarea getSelectedTarea() {
        return selectedTarea;
    }

    public void setSelectedTarea(Tarea selectedTarea) {
        this.selectedTarea = selectedTarea;
    }

    public void deleteTarea() {
        if (context != null) {
            ProductoSeleccionadoBean tareaActual = (ProductoSeleccionadoBean) context.getApplication().
                    evaluateExpressionGet(context, "#{productoSeleccionadoBean}", ProductoSeleccionadoBean.class);
            selectedTarea = (tareaActual.getTareaActual());
            log.log(Level.WARNING, "delete tarea {0} {1}", new Object[]{selectedTarea.getId(), selectedTarea.
                        getDes()});
        }

        esfuerzos = esfuerzoFacade.findByTarea(selectedTarea.getId().toString());
        if (esfuerzos != null && esfuerzos.size() > 0) {
            for (Esfuerzo e : esfuerzos) {
                esfuerzoFacade.remove(e);
            }
        }


        tareaFacade.remove(selectedTarea);
        if (context != null) {
            listado.remove(selectedTarea);
        }        
    }

    public String getColaborador() {
        return colaborador;
    }

    public void setColaborador(String colaborador) {
        this.colaborador = colaborador;
    }

    public String getEsfuerzo() {
        return esfuerzo;
    }

    public void setEsfuerzo(String esfuerzo) {
        this.esfuerzo = esfuerzo;
    }

    public String asignar() {
        log.log(Level.INFO, "backlog.java: funcion asignar()");
        if (colaborador != null) {
            //log.log(Level.INFO, "baaa.java: dentro del if");
            if (context != null) {
                tareaActual = (ProductoSeleccionadoBean) context.getApplication().
                    evaluateExpressionGet(context, "#{productoSeleccionadoBean}", ProductoSeleccionadoBean.class);                
            }   
            
            Tarea tarea = (tareaActual.getTareaActual());

            Colaborador c = colaboradorFacade.findByNombre(colaborador);
            //log.log(Level.WARNING, c.getNombre());
            tarea.setIdColaboradorFk(c);

            Estado es = estadoFacade.findByEstado("ToDo");
            tarea.setIdEstadoFk(es);

            String sprint = tareaActual.getSprintActual();
            Sprint s = sprintFacade.findById(sprint);
            tarea.setIdSprintFk(s);

            tareaFacade.edit(tarea);


            log.log(Level.INFO, "Tarea {0} asignada a sprint {1}:{2}", new Object[]{tarea.getDes(), tarea.
                        getIdSprintFk().getDes(), tarea.getIdEstadoFk().toString()});
            return ("");
        } else {
            log.log(Level.WARNING, "Has dejado un campo vacío");
            return ("");
        }
    }

    public String guardarEsfuerzo() {
        if (esfuerzo != null && esfuerzo != "") {
            tareaActual = (ProductoSeleccionadoBean) context.getApplication().
                    evaluateExpressionGet(context, "#{productoSeleccionadoBean}", ProductoSeleccionadoBean.class);
            Tarea tarea = (tareaActual.getTareaActual());
            Esfuerzo e = new Esfuerzo();
            e.setDuracion(Float.parseFloat(esfuerzo));
            e.setIdTareaFk(tarea);
            e.setFec(new Date());
            esfuerzoFacade.create(e);
            if (tarea.getEsf() == 0) {
                tarea.setEsf(Integer.parseInt(esfuerzo));
                tareaFacade.edit(tarea);
            }
            log.log(Level.INFO, "Esfuerzo agregado: {0}", e.getDuracion());
        } else {
            log.log(Level.INFO, "Esfuerzo el null y no se puede agregar");
        }

        return ("");
    }

    private TareaFacade lookupTareaFacade() {
        try {
            Context c = new InitialContext();
            return (TareaFacade) c.lookup("java:global/ScrumPMT/ScrumPMT-ejb/TareaFacade!org.scrumpmt.ejb.TareaFacade");
        } catch (NamingException ne) {
            log.log(Level.SEVERE, "exception caught", ne);
            throw new RuntimeException(ne);
        }
    }

    private EsfuerzoFacade lookupEsfuerzoFacade() {
        try {
            Context c = new InitialContext();
            return (EsfuerzoFacade) c.lookup("java:global/ScrumPMT/ScrumPMT-ejb/EsfuerzoFacade!org.scrumpmt.ejb.EsfuerzoFacade");
        } catch (NamingException ne) {
            log.log(Level.SEVERE, "exception caught", ne);
            throw new RuntimeException(ne);
        }
    }

    private EstadoFacade lookupEstadoFacade() {
        try {
            Context c = new InitialContext();
            return (EstadoFacade) c.lookup("java:global/ScrumPMT/ScrumPMT-ejb/EstadoFacade!org.scrumpmt.ejb.EstadoFacade");
        } catch (NamingException ne) {
            log.log(Level.SEVERE, "exception caught", ne);
            throw new RuntimeException(ne);
        }
    }

    private ColaboradorFacade lookupColaboradorFacade() {
        try {
            Context c = new InitialContext();
            return (ColaboradorFacade) c.lookup("java:global/ScrumPMT/ScrumPMT-ejb/ColaboradorFacade!org.scrumpmt.ejb.ColaboradorFacade");
        } catch (NamingException ne) {
            log.log(Level.SEVERE, "exception caught", ne);
            throw new RuntimeException(ne);
        }
    }

    private SprintFacade lookupSprintFacade() {
        try {
            Context c = new InitialContext();
            return (SprintFacade) c.lookup("java:global/ScrumPMT/ScrumPMT-ejb/SprintFacade!org.scrumpmt.ejb.SprintFacade");
        } catch (NamingException ne) {
            log.log(Level.SEVERE, "exception caught", ne);
            throw new RuntimeException(ne);
        }
    }

    public final void buscarBacklog() {
        listado = tareaFacade.findByProyecto(producto);
    }

    public ProductoSeleccionadoBean getTareaActual() {
        return tareaActual;
    }

    public void setTareaActual(ProductoSeleccionadoBean tareaActual) {
        this.tareaActual = tareaActual;
    }
}
